變數的概念來自於數學,是程式語言能表達抽象概念或儲存運算結果的工具。一般我們可以透過變數名來取得變數的值。使用變數之前必須先宣告變數,宣告變數時與javascript一樣使用var
:
var 變數名稱 變數型別 = 值
// 比方說
var s string = "hello world!"
如果你之前學過Java,可能會覺得很不習慣,覺得型別與名稱顛倒,我相信過一段時間就會適應了。型別與給值可以擇一省略,例如:
// 省略型別
var s = "Hi"
// 省略給值
var s string
如果省略型別,將會根據值的型別來定義變數的型別(這點跟ruby一樣);如果省略給值,go跟其他語言很不一樣,會自動根據型別初始化!各型別的初始值如下:
型別 | 初始值 |
---|---|
布林值 | false |
數值 | 0 |
字串 | 空字串 |
集合與函數 | nil |
這個機制可以確保每個宣告的變數都有一個合理的初始值,因此在go語言當中不存在未初始化的變數。這個設計大大減少了工程師的麻煩,也可以節省許多時間與程式碼。不愧是較晚發明的程式語言,專門解決工程師的痛點。
如果有多個變數想一次宣告,當然也有偷懶的方法:
// 省略給值
var a, b, c int // int, int, int
// 省略型別
var x, y, z = true, 9.2, "haha" // bool, float64, string
一個專案無可避免會宣告大量的變數,如果每次都要var
來var
去會覺得很煩,所以go有一種簡短版的宣告方法:
i := 100
可以省略型別與var,藉由給值來決定型別。但要特別注意簡短宣告只能用在函示內,不可以做為全域變數的宣告與賦值。這邊有幾點是需要特別注意的:
:=
是變數宣告,與一般的給值=
是不同的,不要混淆。和基礎宣告一樣,簡短宣告一樣可以同時宣告多個變數,方法如下:
a, b := 1, 2
常數是在程式中我們不希望會改變的值。宣告結構與變數非常相似:
const ip string = "127.0.0.1"
基本上就是最前面由var改為const,型別一樣可以省略,由值決定型別。當然也一樣可以一次宣告多個常數:
const apple, banana = 12, 8
// 或是另一個格式
const (
Unknow = 0
Male = 1
Female = 2
)
Go的合法命名為字母、數字、下底線所組成(大小寫為不同字、首字不可為數字,可以為底線),這個命名規則是包括變數名、常數名、函示名等所有的名稱。
go語言有25個關鍵字,這些關鍵字不可作為命名使用(但可以成為名稱的一部分):
break | default | func | interface | select |
---|---|---|---|---|
case | defer | go | map | struct |
chan | else | goto | package | switch |
const | fallthrough | if | range | type |
continue | for | import | return | var |
此外還有三十多個預先定義的名稱,主要是內建的常數、類型與函示:
true false iota nil
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
float32 float64 complex128 complex64
bool byte rune string error
make len cap new append copy close delete
complex real imag panic recover
這些預先定義的名稱不是關鍵字,在適當的時候也可以覆寫它重新給予意義。但建議最好完全知道你自己在做什麼才這麼做,不然可能會產生很多麻煩。
雖然名稱長度上沒有限制,但在命名習慣上,go傾向短小的名稱,這點與java恰好形成強烈的對比。另外go推薦使用駝峰式命名(Camle case)而不是蛇式(snake case),所以符合go風格的名稱會是haveBook
而不是have_book
。
命名名稱開頭大小寫
是否跟以後撰寫從外部引用是否有關係?
const常數也是駝峰式命名嗎?
謝謝
常數一般來說首字大寫;命名跟外部引用應該沒有關係。